package com.atguigu.bigdata.scala.chapter05

object Scala07_Function_Hell_1 {

    def main(args: Array[String]): Unit = {

        // TODO 函数式编程 - 地狱
        def fun1(): Unit = {
            println("fun1...")
        }

        // 当前场合使用下划线将函数作为整体，因为使用类型推断，会将函数进行调用，将返回值给变量
        // 如果不想使用下划线，那么就需要声明函数类型
        //val f : ()=>Unit = fun1
        //f()

        // 函数参数的个数问题
        // 如果将函数作为功能来使用，参数个数没有限制的
        // 如果将函数作为对象来使用，那么参数的个数不能超过22
        // 马丁的幸运数字：22
        // TODO 函数类型有两种声明方式：
        // 1 : 输入类型=>输出类型   (String)=>String
        // 2 : 使用特殊类型 Function0[Unit]
        def fun7(
                    age0 : Int,
                    age1 : Int,
                    age2 : Int,
                    age3 : Int,
                    age4 : Int,
                    age5 : Int,
                    age6 : Int,
                    age7 : Int,
                    age8: Int,
                    age9 : Int,
                    age10 : Int,
                    age11 : Int,
                    age12 : Int,
                    age13 : Int,
                    age14 : Int,
                    age15 : Int,
                    age16 : Int,
                    age17 : Int,
                    age18 : Int,
                    age19 : Int,
                    age20 : Int,
                    age21 : Int
                ) : Unit = {
            println("fun7")
        }

        //fun7(1,2,3,4,5,6,7,8,9,0, 1,2,3,4,5,6,7,8,9,0, 1,2,3,4,5)
        val f7 = fun7 _

        f7(1,2,3,4,5,6,7,8,9,0, 1,2,3,4,5,6,7,8,9,0, 1,2)

        // 将函数作为对象
        // val 变量名 ： 函数类型 = 函数对象
        def fun3(name:String): String = {
            name.substring(0,1)
        }
        val ff : (String)=>String = fun3

        println(ff("zhangsan"))


    }
}
